console.log('script start')

async function async1() {
    // 遇到 await 就会先返回，
    // 等到异步操作执行完成，再接着执行函数体内后面的语句
    await async2()   // async2() 后阻断
    console.log('async1 end')
};

async function async2() {
    console.log('async2 end')
};
async1()

setTimeout(function () {
    console.log('setTimeout')
}, 0);

new Promise(resolve => {
        console.log('Promise')
        resolve()   // 改状态
    })  // then 方法只有在所有同步任务执行完后才会执行
    .then(function () {   // then 加入微任务
        console.log('promise1')
    })
    .then(function () {   // then 加入微任务
        console.log('promise2')
    });

console.log('script end');

// script start -> async2 end -> Promise -> script end -> promise1 -> promise2 -> async1 end




console.log('-------------------------------------------------------------------------------------------------------')

/**
 * await后面的函数执行完毕时，await会产生一个【微任务】(Promise.then是微任务)
 * 但是我们要注意这个微任务产生的时机，它是执行完await之后，直接跳出async函数，
 * 执行其他代码(此处就是协程的运作，A暂停执行，控制权交给B)。其他代码执行完毕后，
 * 再回到async函数去执行剩下的代码，然后把await后面的代码注册到微任务队列当中。
 * 
 * 【通俗来说 await就是放在当前宏任务产生的微任务的末尾！！！】
 * **/
console.log('script start')

async function async1() {
    await async2()
    console.log('async1 end')
};
async function async2() {
    console.log('async2 end')
    return Promise.resolve().then(()=>{
        console.log('async2 end1')
    })
}
async1();

setTimeout(function() {
    console.log('setTimeout')
}, 0)

new Promise(resolve => {
    console.log('Promise')
    resolve()
})
.then(function() {
    console.log('promise1')
})
.then(function() {
    console.log('promise2')
})

console.log('script end');


// script start -> async2 end  -> Promise -> script end -> async2 end1 
// -> promise1 -> promise2 -> async1 end -> setTimeout